package com.qili.util;

import com.qili.annotation.Bookmark;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class ClassUtils {
    /**
     * @Author:zhaoyongke
     * @Description: 获取当前类的属性(包含父类)
     * @param pClass
     * @Date:11:20 2020/11/17
     */
    public static List<Field> getDeclaredFields(Class<?> pClass,Boolean pParent) {
        // 获取当前类中的元素
        Field[] AyFields = pClass.getDeclaredFields();
        // 所有属性缓冲
        List<Field> AlstFields = new ArrayList<>();
        // 获取有多少个字段
        int filedLength = AyFields.length;
        for(int i = 0; i < filedLength; ++i) {
            Field AfTmp = AyFields[i];
            AlstFields.add(AfTmp);
        }
        //判断是否存在父类信息，如果存在则递归的走一次获取类下面的元素
        if (pParent && (!pClass.getSuperclass().equals(Object.class))) {
            AlstFields.addAll(getDeclaredFields(pClass.getSuperclass(),pParent));
        }
        return AlstFields;
    }

    /**
     * @Description: 获取当前类所有的书签      取出所有的带有Bookmark注解的属性,取出注解的mark值,放入list返回
     * @param clazz
     * @param parent
     * @return
     */
    public static List<Field> getBookmarkFields(Class<?> clazz,Boolean parent){
        // 获取当前类中的元素
        Field[] AyFields = clazz.getDeclaredFields();
        // 所有属性缓冲
        List<Field> bookmarkFieldList = new ArrayList<>();
        // 获取有多少个字段
        int filedLength = AyFields.length;
        for(int i = 0; i < filedLength; ++i) {
            AyFields[i].setAccessible(true);
            Bookmark annotation = AyFields[i].getAnnotation(Bookmark.class);
            if(annotation != null){
                bookmarkFieldList.add(AyFields[i]);
            }
        }
        //判断是否存在父类信息，如果存在则递归的走一次获取类下面的元素
        if (parent && (!clazz.getSuperclass().equals(Object.class))) {
            bookmarkFieldList.addAll(getBookmarkFields(clazz.getSuperclass(),parent));
        }
        return bookmarkFieldList;
    }
}
